home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bmgrep.arc / BM.C < prev    next >
Text File  |  1986-12-09  |  2KB  |  92 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <string.h>
  4. #include "bm.h"
  5. #include "extern.h"
  6. main(argc,argv)
  7. int argc;
  8. char *argv[];
  9. {
  10.     /* grep based on Boyer-Moore algorithm */
  11.     char BigBuff[MAXBUFF + 2];
  12.     /*
  13.     * We leave one extra character at the beginning and end of the buffer,
  14.     * but don't tell Execute about it. This is so when someone is
  15.     * scanning the buffer and scans past the end (or beginning)
  16.     * we are still technically in the buffer (picky, but there ARE
  17.     * machines which would complain)
  18.     */
  19.     int ret = 1, /* return code from Execute */
  20.         NotFound = 0,        /* non-zero if file not readable */
  21.         NFiles,
  22.         NPats; /* number of patterns to search for */
  23.     char *FlagPtr,
  24.         **OptPtr; /* used to scan command line */
  25.     int TextFile /* file to search */;
  26.     struct PattDesc *DescVec[MAXPATS];
  27.  
  28.     --argc;
  29.     OptPtr = argv + 1;
  30.     while ( argc && **OptPtr == '-') {
  31.         FlagPtr = *OptPtr + 1;
  32.         do { 
  33.             switch (*FlagPtr) {
  34.                 case 'c': cFlag = 1; break;
  35.                 case 'e': eFlag = 1;
  36.                     /* get the patterns from next arg */
  37.                     NPats = MkDescVec(DescVec,*++OptPtr);
  38.                     --argc;
  39.                     break;
  40.                 case 'f': fFlag = 1; 
  41.                     /* read the patterns from a file */
  42.                     NPats = GetPatFile(*++OptPtr,DescVec);
  43.                     --argc;
  44.                     break;
  45.                 case 'l': lFlag = 1; break;
  46.                 case 'n': nFlag = 1; break;
  47.                 case 's': sFlag = 1; break;
  48.                 case 'x': xFlag = 1; break;
  49.                 case 'h': hFlag = 1; break;
  50.                 default:
  51.                     fprintf(stderr,
  52.                     "bm: invalid option: -%c \n",
  53.                     *FlagPtr);
  54.                     PutUsage();
  55.                     exit(2);
  56.             } /* switch */
  57.             ++FlagPtr;
  58.         } while (*FlagPtr);
  59.         ++OptPtr; --argc;
  60.     } /* while */
  61.     /* OptPtr now points to patterns */
  62.     if (!fFlag && !eFlag) {
  63.         if (!argc) {
  64.             fprintf(stderr,"bm: no pattern specified\n");
  65.             PutUsage();
  66.             exit(2);
  67.         } else
  68.             NPats = MkDescVec(DescVec,*OptPtr);
  69.         ++OptPtr; --argc;
  70.     }
  71.     /* OptPtr now points to first file */
  72.     NFiles = argc;
  73.     if (!NFiles)
  74.         ret &= Execute(DescVec,NPats,0,BigBuff+1);
  75.     else while (argc--) {
  76.         if ((NFiles > 1) || lFlag) FileName = *OptPtr;
  77.         if ((TextFile = open(*OptPtr,O_RDONLY,0)) < 0) {
  78.             fprintf(stderr,"bm: can't open %s\n",*OptPtr);
  79.             NotFound++;
  80.         }
  81.         else {
  82.             ret &= Execute(DescVec,NPats,TextFile,BigBuff+1);
  83.             if (sFlag && !ret)
  84.                 exit(0);
  85.             close(TextFile);
  86.         } /* if */
  87.         ++OptPtr;
  88.     } /* while */
  89.     if (cFlag) printf("%d\n",MatchCount);
  90.     exit(NotFound ? 2 : ret);
  91. } /* main */
  92.